mssql

推荐列表 站点导航

当前位置:首页 > 数据库 > mssql >

SQL Join的一些总结(实例)

来源:网络整理  作者:网络  发布时间:2020-12-10 06:56
Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等...
图3左联接查询结果

create table College(cName nvarchar(50), state text, enrollment int);
SELECT DISTINCT College.cName, College.enrollment


假设我们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字我们并不能预知,所以我们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。

FROM College INNER JOIN


复制代码 代码如下:

Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性


不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在SQL Server中有多种应用场合。我们可以使用EXISTS子来实现Semi-join查询,Not EXISTS来实现Anti-semi-join。现在让我们通过具体的例子说明吧!
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Apply') DROP TABLE Apply;

SQL Join的一些总结(实例)


由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以我们知道Apply表中没有学生申请Harvard。

---- Create Database.

复制代码 代码如下:

复制代码 代码如下:


SELECT Student.sName, Student.GPA, Student.sizeHS,
Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。


FROM Student OUTER APPLY dbo.fn_Apply([sID])


虽然大多数采用Cross apply实现的查询,可以通过Inner join实现,但Cross apply可能产生更好的执行计划和更佳的性能,因为它可以在联接执行之前限制集合加入。
cName, major

---- Gets all information from college and apply table.
Outer apply
图8 执行计划
通过以上的SQL执行时间和执行计划,我们能不能说Inner join比Cross apply好呢?答案是否定的,如果表的数据量很大,那么Inner join的全表扫描耗费时间和CPU资源就增加了(可通过数据量大的表进行测试)。
---- Student outer apply function fn_Apply.
如上图3所示:由于在Apply表中并没有学生申请Harvard,但是我们通过左联接(left outer join)把所有学校信息查询出来了。
SELECT College.cName, College.state, College.enrollment,

Inner join
FROM College FULL OUTER JOIN
Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。
1.1.2 正文

USE tempdb
通过左联接查询我们可以获取College的完全集,假设现在我们既要获取College的完全集又要获取Apply的完全集,那么我们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,我们可以查询所有的学校,不管它们是否匹配联接谓词:

内联接(Inner join)是最常用的联接类型之一,它查询满足联接谓词的数据。
---- Gets college information from college table

复制代码 代码如下:

如图8所示:Cross apply首先执行TVF(table-valued functions),然后对表Studnet进行全表扫描,接着通过遍历sID查找匹配值。



create table Student(sID int, sName nvarchar(50), GPA real, sizeHS int);

复制代码 代码如下:

首先我们在tempdb中分别定义三个表College、Student和Apply,具体SQL代码如下:

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'College') DROP TABLE College;
图4 College表和Apply表的行数
Apply ON College.cName = Apply.cName
Apply ON College.cName = Apply.cName
---- bases on college name.

在介绍Cross apply和Outer join之后,现在让我们理解Out apply也就不难了,Outer apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询,找到匹配值则有值,没有找到匹配值则以NULL表示。

SQL Join的一些总结(实例)


本文将通过具体例子介绍SQL中的各种常用Join的特性和使用场合:
具体SQL代码如下:




SQL Join的一些总结(实例)


IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student;
Inner join对表Student和Apply进行全表扫描,然后通过哈希匹配查找匹配的sID值。

---- If database exists the same name datatable deletes it.


Apply.cName, Apply.major, Apply.decision

SQL Join的一些总结(实例)

Semi-join和Anti-semi-join

图6 Cross apply查询
create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);
假设要求我们找出Apply和Student表中sID匹配的学生信息,这和前面的Inner join查询结果将一样,具体SQL代码如下:

1.1.1 摘要

相关热词: 实例

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/mssql/2078.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

SQL Join的一些总结(实例)

2020-12-10 编辑:网络

图3左联接查询结果

create table College(cName nvarchar(50), state text, enrollment int);
SELECT DISTINCT College.cName, College.enrollment


假设我们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字我们并不能预知,所以我们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。

FROM College INNER JOIN


复制代码 代码如下:

Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性


不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在SQL Server中有多种应用场合。我们可以使用EXISTS子来实现Semi-join查询,Not EXISTS来实现Anti-semi-join。现在让我们通过具体的例子说明吧!
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Apply') DROP TABLE Apply;

SQL Join的一些总结(实例)


由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以我们知道Apply表中没有学生申请Harvard。

---- Create Database.

复制代码 代码如下:

复制代码 代码如下:


SELECT Student.sName, Student.GPA, Student.sizeHS,
Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。


FROM Student OUTER APPLY dbo.fn_Apply([sID])


虽然大多数采用Cross apply实现的查询,可以通过Inner join实现,但Cross apply可能产生更好的执行计划和更佳的性能,因为它可以在联接执行之前限制集合加入。
cName, major

---- Gets all information from college and apply table.
Outer apply
图8 执行计划
通过以上的SQL执行时间和执行计划,我们能不能说Inner join比Cross apply好呢?答案是否定的,如果表的数据量很大,那么Inner join的全表扫描耗费时间和CPU资源就增加了(可通过数据量大的表进行测试)。
---- Student outer apply function fn_Apply.
如上图3所示:由于在Apply表中并没有学生申请Harvard,但是我们通过左联接(left outer join)把所有学校信息查询出来了。
SELECT College.cName, College.state, College.enrollment,

Inner join
FROM College FULL OUTER JOIN
Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。
1.1.2 正文

USE tempdb
通过左联接查询我们可以获取College的完全集,假设现在我们既要获取College的完全集又要获取Apply的完全集,那么我们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,我们可以查询所有的学校,不管它们是否匹配联接谓词:

内联接(Inner join)是最常用的联接类型之一,它查询满足联接谓词的数据。
---- Gets college information from college table

复制代码 代码如下:

如图8所示:Cross apply首先执行TVF(table-valued functions),然后对表Studnet进行全表扫描,接着通过遍历sID查找匹配值。



create table Student(sID int, sName nvarchar(50), GPA real, sizeHS int);

复制代码 代码如下:

首先我们在tempdb中分别定义三个表College、Student和Apply,具体SQL代码如下:

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'College') DROP TABLE College;
图4 College表和Apply表的行数
Apply ON College.cName = Apply.cName
Apply ON College.cName = Apply.cName
---- bases on college name.

在介绍Cross apply和Outer join之后,现在让我们理解Out apply也就不难了,Outer apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询,找到匹配值则有值,没有找到匹配值则以NULL表示。

SQL Join的一些总结(实例)


本文将通过具体例子介绍SQL中的各种常用Join的特性和使用场合:
具体SQL代码如下:




SQL Join的一些总结(实例)


IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student;
Inner join对表Student和Apply进行全表扫描,然后通过哈希匹配查找匹配的sID值。

---- If database exists the same name datatable deletes it.


Apply.cName, Apply.major, Apply.decision

SQL Join的一些总结(实例)

Semi-join和Anti-semi-join

图6 Cross apply查询
create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);
假设要求我们找出Apply和Student表中sID匹配的学生信息,这和前面的Inner join查询结果将一样,具体SQL代码如下:

1.1.1 摘要

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/mssql/2078.shtml

相关文章

风云图片

推荐阅读

返回mssql频道首页